「提示工程系列」转译(3):提示工程进阶-当小样本学习还不足以解决问题怎么办?
题图|论文截图
▽
论述题记
大型语言模型 (LLM) 的普及彻底改变了我们作为人类解决问题的方式。在前几年,用计算机解决任何任务(例如,重新转换文档格式或对句子进行分类)都需要创建一个程序(即,一组根据某种编程语言精确编写的命令)。使用 LLM,解决此类问题只需要一个文本提示。例如,我们可以通过类似于下图所示的提示来指示 LLM 重新生成指定格式的文档。
在之前的一篇文章中,我们了解了更基本的 LLM 提示方法,例如零/少量学习和指令提示。了解这些实用的提示技巧对于掌握此处将要介绍的更高级的提示程序非常重要。有关这些技术的更多详细信息,请查看以下链接中的基础实用提示技术!
*「提示工程系列」转译(2):实用提示工程-成功提示 LLM 的提示和技巧
更好的提示→更好的结果|这样的提示技巧可用来让 LLM 完成很多工作(如果它们被正确应用的话)。但是由于各种原因,它们可能会达不到要求。Few-shot learning 会导致大多数 LLM 的有限上下文窗口被范例占用,如果没有采取保护措施,LLM 可能会被诱骗提供有害的输出,并且大多数模型不擅长解决推理任务或遵循多任务步骤说明。
鉴于这些限制,我们应该如何继续尝试用 LLM 解决困难复杂的任务呢?一种方法是从头开始或通过更好的精调程序创建更有能力的 LLM。然而,这需要付出很大的努力!
如果我们可以让现有模型直接更好地解决问题呢?在这篇文章中,我们将探索更高级的提示工程形式(例如,思维链提示、自动提示工程、信息检索等),使我们能够提高 LLM 性能并引发更复杂的问题解决行为。
学习这些想法很重要,因为它们拓宽了 LLM 的可能性范围。例如,使用这些技术,我们可以:
允许 LLM 访问外部知识数据库。 解决复杂的、基于推理的问题。 通过允许模型存储和访问对话中的先前信息,为 LLM 提供无限内存。
提示工程正在发展|本概述将侧重于提供提示工程最新进展的高级视图。我们不会深入探索个别方法,而是专注于获得对可能有用的不同提示技术的广泛了解。然而,应该指出的是,提示工程的主题既新又发展迅速。几乎每天都有新的研究发布,许多前沿思想只是在网上分享,并没有正式发表。因此,该主题可能会在未来几个月内发生重大转变,从而扩大 LLM 可以解决的问题。(在笔者转译的这周,刚刚发布了ToT-Tree of Thoughts:https://arxiv.org/pdf/2305.10601)
▩了解LLM
由于本文侧重于提示工程,因此不会过多解释语言模型的历史或机制。为了更好地全面了解语言模型(这是深入理解提示的重要先决条件),我写了各种可用的概述。下面列出了这些概述(按重要性排序):
语言建模基础知识(GPT 和 GPT-2) [https://cameronrwolfe.substack.com/p/language-models-gpt-and-gpt-2]
语言模型规模的重要性 (GPT-3) [https://cameronrwolfe.substack.com/p/language-model-scaling-laws-and-gpt]
现代 [https://cameronrwolfe.substack.com/p/modern-llms-mt-nlg-chinchilla-gopher] 和专业 [https://cameronrwolfe.substack.com/p/specialized-llms-chatgpt-lamda-galactica] LLMs
PaLM, T5 (第一和第二部分), LLaMA (第一和第二部分)
高级提示技巧
我们现在将讨论提示工程范畴中的三个有影响力的主题。
首先,我们将了解如何使用思维链提示(包括几个显著的扩展和变体)来提高 LLM 的推理能力。
接下来,我们将讨论 LLM 与外部数据库的集成,以便将相关的、准确的信息注入每个提示中。
最后,我们将学习如何使用自动提示工程方法从生成数据中发现更好的提示。
▩思维链提示及其之外
我们在之前的一篇文章中介绍了思想链 (CoT) 提示 [1] 及其一些流行变体背后的主要思想。有关完整详细信息,请阅读以下链接中的概述。
CoT提示是什么?| CoT 提示是一种简单的技术,用于提高 LLM 在常识或符号推理等任务上的表现。CoT 提示通过在提示中插入几个正在解决的推理问题示例来利用少样本学习。每个示例都与一系列思路(或逻辑依据)匹配,通过文本解释问题是如何逐步解决的,从而增强问题的最终解答;见下图。
基于小样本学习能力,LLM 可以通过观察 CoT 提示中的范例来学习生成逻辑步骤及其答案。先前的工作表明,以这种方式生成准确的逻辑步骤可以提高推理性能 [10、11],我们在 CoT 提示的实验中看到了这种效果。也就是说,教 LLM 输出相关的思维链来解释其最终答案,可以极大地提高算术、符号和常识推理等任务的性能;见下图。
流行的 CoT 变体|除了基本的 CoT 提示之外,还探索了该技术的几种变体,例如:
“Zero-shot CoT prompting [13]: replacing all example rationales and instead injecting the statement “Let’s think step by step” at the end of the prompt.” - from [2]
“零样本 CoT 提示 [13]:替换所有示例基本原理,并在提示末尾插入语句“让我们一步步思考。” - 摘自论文[2]
Self-consistency [14]: using the LLM to generate multiple chains of thought and taking the majority vote of these multiple outputs as the final answer.
Self-consistency 提示[14]:使用 LLM 生成多个思维链,并将这些多个输出的多数票作为最终答案。
Least-to-most prompting [15]: decomposing reasoning problems into smaller steps that are solved one-at-a-time, where the output of each subproblem is used as input for the next.
Least-to-most 提示 [15]:将推理问题分解为更小的步骤,一次解决一个问题,其中每个子问题的输出用作下一个子问题的输入。
这些技术(如下图所示)类似于 CoT 提示并产生可比较的结果,但它们各自具有独特的优势。例如,零样本 CoT 提示非常简单!我们只需要在我们的提示中插入一个语句,而不是手写或策划几个相关的思维链示例。另一方面,least-to-most 提示比 vanilla CoT 提示稍微复杂一些,但这种技术也更能解决需要很多步骤的推理问题。因此,我们可以使用从最少到最多的提示来解决 CoT 提示不足解决的最困难任务。
在这些技术中,自洽性是我个人最喜欢的。为什么?因为它是一种简单的技术,适用范围广,而且非常有效。事实上,这个想法甚至不是特定于 CoT 提示!在许多情况下,自洽性可以提高 LLM 应用程序的性能。我们不是使用 LLM 生成单个输出,而是生成多个输出并将它们的平均值作为我们的最终答案,从而提高可靠性和准确性。
这个想法让我想起了深度学习中的模型集成,我们
ii) 在推理时取每个模型输出的平均值。
尽管自洽性仅使用单个模型而不是集成模型,但类似的技术已应用于更广泛的深度学习文献中;例如,为了模拟一个集成,可以从包含非确定性模块(如 dropout [19、20])的神经网络中生成多个输出并取平均值。
扩展 CoT 提示|CoT 提示是否真的教会 LLM 如何“推理”尚不清楚。尽管如此,CoT 提示具有重要的实际意义,因为它可用于解决 LLM 的复杂、多步骤问题。因此,最近探索了围绕 CoT 提示的各种有趣想法。在 [16] 中,探索了 CoT 提示的多模态版本,其中图像和文本模态都用于执行不同的推理任务;见下图。
除了探索多种数据模式(即图像和文本)之外,[16] 中的作者通过将多步逻辑依据生成和答案推理视为解决基于推理的任务的两个不同步骤来稍微调整 CoT 设置;见下图。
通过清楚地隔离这些组件,我们可以更轻松地分析 CoT 提示中的错误来源。因此,[16] 中的作者发现
更进一步,论文[17] 中的作者将 CoT 提示与主动学习的想法结合起来(即使用模型本身来识别应该包含在训练集中的数据)。LLM 首先使用 CoT 提示回答几个问题。从这里开始,输出“不确定性”(根据同一 LLM 生成的多个答案之间的分歧来衡量)用于识别模型理解不佳的问题。然后用正确的思路(由人类)手动注释该组中的问题,并用作解决未来问题的示例。
我们在实践中应用 CoT 提示时,可能遇到的最大问题之一,是缺乏与我们试图解决的任务很好地对齐的少样本示例。也许我们可以访问几个高质量的思维链以包含在我们的提示中,但是如果我们试图解决的问题与这些示例中解决的问题略有不同,我们该怎么办?虽然这样的问题会导致性能下降,但[17]中提出的方法旨在解决这个问题。也就是说,我们可以使用主动学习来动态识别 CoT 提示的可用示例何时不足以解决某个问题。
▩知识增强
尽管 LLM 在预训练期间学到了很多信息,但在他们的提示中增加额外的相关信息通常是有帮助的。这种方法可以通过在 LLM 的提示中提供准确的信息来源来帮助解决幻觉(即生成不正确的事实)等问题,这些信息可以在生成输出时用作上下文。尽管有多种方法可以实现这一点,但我们将重点关注基于信息检索和生成知识的技术。
信息检索|由于向量数据库技术(例如 Pinecone、Milvus、Weaviate 等)在执行信息检索方面的作用,LLM 社区最近将重点放在向量数据库技术上;见上图。在高层次上,信息检索的目标是使 LLM 能够通过以下方式访问大量文本信息(超出最大上下文窗口):
将文本分成小部分。
为每个文本块生成一个嵌入。
将这些嵌入存储在矢量数据库中。
执行向量相似性搜索(基于这些嵌入)以查找要包含在提示中的相关文本块。
最终结果是我们可以快速找到相关的文本信息,作为 LLM 提示中的额外上下文。这种方法甚至可以与 CoT 提示相结合,以引导检索过程获得新的有用信息 [2]。
生成知识|信息检索功能强大(即,它可以访问几乎无限量的信息!),但我们可能想知道:外部矢量数据库是否完全必要?有趣的是,最近的研究 [1] 表明答案可能是否定的!我们可以通过另行提示 LLM 生成信息来提高 LLM 性能,而不是存储和检索外部知识;见上图。特别是,我们可以通过使用各种主题的知识生成示例提示 LLM ,并以生成所需主题有关的有用上下文的请求结果,来使用小样本学习;见下图。
从这里开始,我们可以在生成预测时将生成的信息作为额外的上下文提供。尽管不依赖任何外部数据库,但这种方法可以显著提高 LLM 在几个常识性推理任务上的性能;见下图。
生成的知识对于假定理解世界常识知识的任务(如常识推理)最有帮助。简而言之,LLM 是一个很好的信息来源,只要它们被谨慎使用并用于正确的任务类型。
“Generated knowledge prompting highlights large language models as flexible sources of external knowledge for improving commonsense reasoning” - from [1]
“生成的知识提示突出了大型语言模型作为外部知识的灵活来源,以提高常识推理”——来自 [1]
▩自动提示(Automatic Prompting)
提示工程的目标是两次调整我们语言模型的输入,以便我们最大限度地提高模型提供正确结果的机会。考虑到这一点,我们甚至可以将我们的提示视为一组可以更新的可训练参数(例如,使用梯度下降或其他一些数据驱动的标准)以生成正确答案。基于数据自动更新我们的提示的想法非常通用,但在最近的研究中已经成功探索了几种这样的技术。
自动提示工程 (APE) [4] |提出了一种自动生成提示指令的简单方法。首先,LLM 用于通过使用带有多个指令示例的少样本提示来提出一组潜在指令。探索了一些用于生成指令的提示模板;见下图。
然后,我们通过评估使用每条指令的 LLM 的零样本性能(即正确结果的准确性或对数概率)来搜索这个指令“候选”池。换句话说,每个提示的 LLM 性能都用作评估教学质量的指标。
更进一步,我们在 [4] 中看到,只需重复此过程即可迭代细化指令。特别是,我们可以
iv) 通过提示 LLM 生成类似指令(即,重采样)。
基于梯度的搜索|除了搜索更好的文本提示的技术之外,还有一系列有用的提示工程工作可以探索持续更新以提示嵌入。首先,我们应该回顾一下语言模型中的提示嵌入是什么。给定文本提示,我们通常将此提示tokenize(即将其分成词或子词),然后查找每个结果token的嵌入。这个过程为我们提供了一个token嵌入列表(即提示嵌入!),我们将其作为输入传递给语言模型;见下图。
一些工作探索了直接修改提示嵌入的提示工程策略(即只是每个标记的嵌入列表)。换句话说,这些工作不会直接修改提示的单词,而是使用梯度下降等规则更新提示嵌入。下面列出了该领域的主要工作:
AutoPrompt [5]| 将原始提示输入与一组共享(跨所有输入数据)“触发token”相结合,这些token是通过基于梯度的搜索选择的,以提高性能。
Prefix Tuning [6]|在输入层和隐藏层的提示嵌入中添加了几个“前缀”token,然后使用梯度下降作为一种参数有效的微调策略来训练这个前缀的参数(保持模型参数固定)。
Prompt Tuning [7]| 类似于前缀调整,但前缀tokens仅添加到输入层。这些tokens针对语言模型解决的每个任务进行微调,允许前缀tokens为给定任务调节模型。
P-Tuning [8]|将任务特定的锚tokens添加到经过微调的模型输入层,但允许将这些tokens放置在任意位置(例如,提示的中间),使该方法比前缀更灵活调整。
我们应该使用哪一个?|所有这些方法(如下所示)都探索了向语言模型添加“软”token,这些token在目标数据集上进行有监督的微调。值得注意的是,这些技术不能用于只能通过付费 API(例如 OpenAI API)访问的语言模型。这是因为我们需要能够访问和修改提示嵌入,而大多数 API 仅显示模型的文本输入和输出。目前,如果我们使用自己的自托管 LLM,我们只能使用基于梯度的自动提示技术。
△
在这些方法中,Prompt Tuning 是最简单的,并且产生了令人印象深刻的性能优势。使用 Prompt Tuning,我们只是
[7] 中的方法通过将几个不同的任务混合到每个更新中并为每个任务提供一个唯一的、学习过的前缀来执行多任务微调;见下图。
通常,微调语言模型意味着我们必须为每个任务存储模型参数的单独副本。相比之下,Prompt Tuning 只是微调一小组前缀标记嵌入,并保持剩余的模型参数固定。尽管只微调了一小部分参数,但 Prompt Tuning 的性能非常接近端到端微调的性能,如下图所示。
论述要点-Takeaways
“How much more can we expect reasoning ability to improve with model scale? What other prompting methods might expand the range of tasks that language models can solve?” - from [9]
“随着模型规模的扩大,我们还能期望推理能力提高多少?还有哪些其他提示方法可以扩展语言模型可以解决的任务范围?” - 来自 [9]
本概述的主要目的是探索不同的提示技术,这些技术可能对解决 LLM 的难题有实际帮助。应用得当的话,像零/少样本学习和指令提示这样的基本技术就已经是有用和有效的。我们当然也可能需要更复杂的方法,来使 LLM 能够解决基于推理的任务或遵循复杂的、多步骤的指令。尽管模型本身性能可能会随着时间的推移而提高并且更容易处理此类困难案例,但本概述中涵盖的技术可用于扩展当前可用的 LLM 的可能性范围。下面概述了这些技术的一些基本要点。
解决难题|CoT 提示分析向我们表明,LLM 能够解决复杂的多步骤问题。但是,要做到这一点,需要将问题分解为更小的部分,或者由 LLM 分解。我们可以通过鼓励模型在回答之前生成解决问题的基本原理来隐式地做到这一点,或者通过使用从最少到最多的提示将问题分解成由 LLM 单独解决的小部分来明确地做到这一点。无论哪种方式,我们通常都会看到鼓励 LLM 逐步解决问题而不是一次性解决问题的好处。
学习提示|如果我们听到“prompt engineering”这个词,我们大多数人可能会想到调整提示的词语或结构,看看什么最有效。然而,这并不是提示工程的唯一方法!即,我们可以采用一种自动提示方法,通过梯度下降从数据中学习最佳提示。为此,我们使提示嵌入(即提示中每个标记的嵌入列表)可训练并执行微调。尽管这种方法有趣且有用,但需要牢记一些注意事项:
学习到的提示嵌入不能映射回文本提示,因为模型词汇表中每个token的嵌入都是离散的。
如果我们可以访问语言模型的嵌入层,我们只能使用这些方法。这种访问不是通过付费 API 提供的(例如,来自 OpenAI)。
简单但强大|尽管本概述侧重于高级提示工程技术,但仍有许多简单的技巧可以轻松应用于改进 LLM 应用程序。例如,自洽性可以通过生成多个答案并取其平均值来提高 LLM 的可靠性。零样本 CoT 提示可以通过在提示末尾附加单个语句来轻松提高 LLM 推理能力。最后,生成的知识可以通过简单地要求模型在生成最终答案之前,列出有关主题的有用信息,来提高 LLM 性能。
在许多情况下,在我们的提示工程工具包中添加简单的技巧可以产生很大的不同!
附录:Bibliography
[1] Liu, Jiacheng, et al. "Generated knowledge prompting for commonsense reasoning." arXiv preprint arXiv:2110.08387 (2021).
参考
-CAMERON R. WOLFE:Advanced Prompt Engineering
往期推荐
「提示工程系列」转译(1):思维链(CoT)提示-一种实用而简单的LLM“推理”方法
「提示工程系列」转译(2):实用提示工程-成功提示 LLM 的提示和技巧
END
扫码加群,
立变AI🍚!
AI范儿读者群
那些prompt了我的,
是否也prompt了你...